package main

import "fmt"

// 没有定义任何方法的接口就是空接口
// 空接口表示没有任何约束，因此任何类型变量都可以实现空接口

// AA 空接口
type AA interface{}

func show(a interface{}) {
	fmt.Printf("值：%v, 类型：%T\n", a, a)
}

func main() {
	// var a AA
	// var str = "你好golang"
	// a = str                           // 让字符串str实现AA这个接口
	// fmt.Printf("值：%v, 类型：%T\n", a, a) //值：你好golang, 类型：string

	// var num = 20
	// a = num                           // 让int类型实现AA这个接口
	// fmt.Printf("值：%v, 类型：%T\n", a, a) // 值：20, 类型：int

	// // 空接口可以直接当做类型来使用，可以表示任意类型
	// var a interface{}
	// a = 20
	// fmt.Printf("值：%v 类型：%T\n", a, a)
	// a = true
	// fmt.Printf("值：%v 类型：%T\n", a, a)

	// // 空接口作为函数参数，表示接受任意类型的参数
	// var a interface{}
	// a = 20
	// show(a)
	// a = true
	// show(a)

	//　创建元素为任意类型的切片
	var s1 = []interface{}{}
	s1 = append(s1, "Golang")
	s1 = append(s1, 300)
	fmt.Println(s1) // [Golang 300]

	// 创建"值"为任意类型的字典
	var m1 = make(map[string]interface{})
	m1["username"] = "Mike"
	m1["age"] = 20
	m1["hobby"] = []string{"篮球", "睡觉", "打游戏"}
	fmt.Printf("值：%#v，类型：%T", m1, m1)
	// 值：map[string]interface {}{"age":20, "hobby":[]string{"篮球", "睡觉", "打游戏"}, "username":"Mike"}，类型：map[string]interface {}
}
